#include <linux/init.h>    //初始化头文件
#include <linux/module.h>  //最基本的文件，支持动态添加和卸载模块。
#include <linux/platform_device.h> //平台设备所需要的头文件


/**
 * @description: 释放 flatform 设备模块的时候此函数会执行
 * @param {structdevice} *dev:要释放的设备
 * @return {*}
 */
void beep_release(struct device *dev)
{
	printk("led_device release \n");
}
// 设备资源信息，也就是led所使用的所有寄存器
struct resource led_res[] = {
	[0] = {
		.start = 0x020AC000,
		.end = 0x020AC003,
		.flags = IORESOURCE_MEM,
		.name = "GPIO5_DR",
	},
	[1] = {
		.start = 0x0209C000,
		.end = 0x0209C003,
		.flags = IORESOURCE_MEM,
		.name = "GPIO1_DR",
	}

};
// platform 设备结构体
struct platform_device led_device = {
	.name = "led_device",
	.id = -1,
	.resource = led_res,
	.num_resources = ARRAY_SIZE(led_res),
	.dev = {
		.release = beep_release}};

/**
 * @description:  设备模块加载
 * @param {*}无
 * @return {*}无
 */
static int device_init(void)
{
	// 设备信息注册到 Linux 内核
	platform_device_register(&led_device);
	printk("platform_device_register ok \n");
	return 0;
}
/**
 * @description: 设备模块注销
 * @param {*}无
 * @return {*}无
 */
static void device_exit(void)
{
	// 设备信息卸载
	platform_device_unregister(&led_device);
	printk("gooodbye! \n");
}

module_init(device_init);
module_exit(device_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple led device");
MODULE_VERSION("1.0");
